package com.mycode.bridging08;

import com.mycode.bridging08.resolve.*;

/**
 * 桥接模式：当软件系统中某类存在两个独立变化的维度，通过该模式可以将这两个维度分离出来，独立扩展，让系统更加符合单一职责原则，
 * 用抽象关联取代传统的多层继承，将类之间的静态继承关系转换为动态的对象组合关系
 * 主要优点：
 *     1、分离抽象接口及其实现部分。桥接模式使用“对象间的关联关系”解耦了抽象和实现之间固有的绑定关系，使得抽象和是心啊可以沿着各自的维度来变化
 *     2、很多情况下，桥接模式可以取代多层继承方案。多层继承方案违背了单一职责原则，复用性交叉，且类的个数非常多，桥接模式是比多层继承方案更好的解决方法
 *     3、提高了系统的可扩展性，在两个变化维度中，任意扩展一个维度都不需要修改原有系统，符合开闭原则
 * 主要缺点：
 *     1、桥接模式的使用会增加系统的理解与设计难度，由于关联关系建立在抽象层，要求有一定的抽象层设计能力
 *     2、桥接模式要求正确识别出系统中两个独立变化的维度，因此其使用范围具有一定的局限性，如何正确识别两个独立维度需要经验积累
 * 适用场景：
 *     1、如果系统需要在抽象类和具体类之间增加更多的灵活性，避免在两个层次之间建立静态的继承关系，通过桥接模式可以使它们在抽象层建立一个关联关系
 *     2、抽象部分和实现部分可以以继承的方式独立扩展而互不影响，在程序运行时可以动态地将一个抽象类子类的对象和一个实现类子类的对象进行组合，即系统需要对抽象类角色和实现类角色进行动态耦合
 *     3、一个类存在两个或多个独立变化的维度，且这两个或多个维度都需要独立进行扩展
 *     4、对于那些不希望使用继承或因为多层级继承导致系统类的个数急剧增加的系统，桥接模式尤为适用
 *
  */
public class Bootstrap {

    public static void main(String[] args) {
        Image image = new BMPImage();
        // ImageImp imageImp = new WindowsImp();
        ImageImp imageImp = new UnixImp();
        image.setImp(imageImp);
        image.parseFile("小龙女");
    }
}
